/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.usuario;

import co.com.ces4.client.baseView.QueryBase;
import co.com.ces4.produccion.client.UsuarioService;
import co.com.ces4.produccion.client.UsuarioServiceAsync;
import co.com.ces4.produccion.client.usuario.data.UsuarioDS;
import co.com.ces4.produccion.client.usuario.data.UsuarioRecord;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class ConsultarUsuario extends QueryBase {

    private DynamicForm frmFiltrosBusqueda;
    private HLayout hlyAccionesConsulta;
    private TextItem txtIdUsuario, txtNombreUsuario, txtLoginUsuario;
    private RadioGroupItem usuarioStatusRg;
    private ButtonItem btnConsultar, btnLimpiar;
    private Button btnNuevo, btnEliminar;
    private ListGrid resultsGrid;

    public ConsultarUsuario() {
        super("Consultar Usuarios", "Parámetros de búsqueda", "Resultados", "100%");
        frmFiltrosBusqueda = new DynamicForm();
        frmFiltrosBusqueda.setCellPadding(10);
        frmFiltrosBusqueda.setWidth100();
        frmFiltrosBusqueda.setHeight("15px");
        frmFiltrosBusqueda.setNumCols(4);

        txtIdUsuario = new TextItem("txtIdUsuario", "Identificación");
        txtNombreUsuario = new TextItem("txtNombreUsuario", "Nombre");
        txtLoginUsuario = new TextItem("txtLoginUsuario", "Login");

        usuarioStatusRg = new RadioGroupItem("userStatus", "Estado");
        usuarioStatusRg.setVertical(false);
        LinkedHashMap<String, String> statusOption = new LinkedHashMap<String, String>();
        statusOption.put("a", "Activo");
        statusOption.put("i", "Inactivo");
        usuarioStatusRg.setValueMap(statusOption);

        hlyAccionesConsulta = new HLayout();
        hlyAccionesConsulta.setWidth100();
        KeyPressHandler enterHandler = new KeyPressHandler() {

            @Override
            public void onKeyPress(com.smartgwt.client.widgets.form.fields.events.KeyPressEvent event) {
                if (event.getKeyName().equals("Enter")) {
                    usuariosList();
                }
            }
        };

        txtIdUsuario.addKeyPressHandler(enterHandler);
        txtNombreUsuario.addKeyPressHandler(enterHandler);
        txtLoginUsuario.addKeyPressHandler(enterHandler);
        usuarioStatusRg.addKeyPressHandler(enterHandler);

        btnConsultar = new ButtonItem("btnConsultar", "Consultar");
        btnConsultar.setColSpan(2);
        btnConsultar.setStartRow(true);
        btnConsultar.setEndRow(false);
        btnConsultar.setAlign(Alignment.RIGHT);
        btnConsultar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                usuariosList();
            }
        });

        btnLimpiar = new ButtonItem("btnLimpiar", "Limpiar");
        btnLimpiar.setColSpan(2);
        btnLimpiar.setStartRow(false);
        btnLimpiar.setEndRow(true);
        btnLimpiar.setAlign(Alignment.LEFT);
        btnLimpiar.setTop(10);
        btnLimpiar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                frmFiltrosBusqueda.clearValues();
                clearResults();
            }
        });

        btnNuevo = new Button("Nuevo");
        btnNuevo.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            @Override
            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                final EdicionUsuario edu = new EdicionUsuario();
                ConsultarUsuario.this.hide();
                edu.setLayoutData("Nuevo Usuario");
                ((Layout) ConsultarUsuario.this.getParentElement()).addMember(edu);
            }
        });

        btnEliminar = new Button("Desactivar");
        btnEliminar.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                ListGridRecord[] selectedUsuarios = resultsGrid.getSelection();
                final List<Usuario> usuarios = new ArrayList<Usuario>();
                for (ListGridRecord usuarioRecord : selectedUsuarios) {
                    usuarios.add((Usuario) usuarioRecord.getAttributeAsObject("usuario"));
                }
                if (usuarios.isEmpty()) {
                    SC.warn("Advertencia", "Debe seleccionar al menos un usuario para realizar la desactivación", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                        }
                    }, new Dialog());
                    return;
                }
                SC.confirm("Confirmar Desactivación", "¿Está seguro que desea desactivar los usuarios seleccionados?", new BooleanCallback() {

                    public void execute(Boolean value) {
                        if (value) {
                            Loader.showLoader();
                            getUsuarioService().desactivarUsuarios(usuarios, new AsyncCallback<Void>() {

                                @Override
                                public void onFailure(Throwable caught) {
                                    SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                                        @Override
                                        public void execute(Boolean value) {
                                        }
                                    }, new Dialog());
                                    Loader.hideLoader();
                                }

                                @Override
                                public void onSuccess(Void result) {
                                    SC.say("El(los) usuarios seleccionado(s) fueron desactivados correctamente");
                                    usuariosList();
                                }
                            });
                        }
                    }
                });
            }
        });

        frmFiltrosBusqueda.setMargin(15);
        frmFiltrosBusqueda.setItems(txtIdUsuario, txtNombreUsuario, txtLoginUsuario, usuarioStatusRg, btnConsultar, btnLimpiar);

        hlyAccionesConsulta.setAlign(Alignment.LEFT);
        hlyAccionesConsulta.setMargin(5);
        hlyAccionesConsulta.addMember(btnNuevo);
        hlyAccionesConsulta.addMember(btnEliminar);
        hlyAccionesConsulta.setMembersMargin(15);

        resultsGrid = new ListGrid() {

            @Override
            protected String getBaseStyle(ListGridRecord record, int rowNum, int colNum) {
                if (getFieldName(colNum).equals("estadoUsuario")) {
                    if (record.getAttribute("estadoUsuario").equals("Activo")) {
                        return "estadoActivo";
                    } else {
                        return "estadoInactivo";
                    }
                } else {
                    return super.getBaseStyle(record, rowNum, colNum);
                }
            }
        };
        resultsGrid.setWidth100();
        resultsGrid.setHeight100();
        resultsGrid.setDataSource(new UsuarioDS());
        resultsGrid.setAutoFetchData(true);
        resultsGrid.setFields(UsuarioRecord.getFields());
        resultsGrid.setEmptyMessage("No hay registros para mostrar");
        resultsGrid.setSelectionType(SelectionStyle.SIMPLE);
        resultsGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        resultsGrid.setFilterOnKeypress(true);
        resultsGrid.setShowFilterEditor(true);
        resultsGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() {

            @Override
            public void onRecordDoubleClick(RecordDoubleClickEvent event) {
                Record usuarioRecord = event.getRecord();
                Usuario usuario = (Usuario) usuarioRecord.getAttributeAsObject("usuario");
                EdicionUsuario edu = new EdicionUsuario(usuario);
                edu.setLayoutData("Edición Usuario");
                ConsultarUsuario.this.hide();
                ((Layout) ConsultarUsuario.this.getParentElement()).addMember(edu);
            }
        });

        addSectionContainerItem(hlyAccionesConsulta);
        setFilterSectionItems(frmFiltrosBusqueda);
        addResultsSectionItem(resultsGrid);
    }

    private void usuariosList() {
        Loader.showLoader();
        String idUsuario = txtIdUsuario.getValueAsString();
        String nombre = txtNombreUsuario.getValueAsString();
        String login = txtLoginUsuario.getValueAsString();
        Boolean activo = null;
        if (usuarioStatusRg.getValue() != null) {
            if (usuarioStatusRg.getValue().equals("a")) {
                activo = true;
            } else {
                activo = false;
            }
        }
        final AsyncCallback<List<Usuario>> queryCallback = new AsyncCallback<List<Usuario>>() {

            @Override
            public void onFailure(Throwable caught) {
                SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                Loader.hideLoader();
            }

            @Override
            public void onSuccess(List<Usuario> result) {
                clearResults();
                for (int i = 0; i < result.size(); i++) {
                    resultsGrid.addData(new UsuarioRecord(result.get(i)));
                }
                Loader.hideLoader();
            }
        };
        getUsuarioService().getUsuarioList(idUsuario, nombre, login, activo, queryCallback);
    }

    private void clearResults() {
        ListGridRecord[] records = resultsGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                resultsGrid.removeData(records[i]);
            }
        }
    }

    private UsuarioServiceAsync getUsuarioService() {
        return GWT.create(UsuarioService.class);
    }
}
